package cz.uhk.ppro.controllers.manager;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Locale;
import java.util.Map;

import javax.servlet.http.HttpSession;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.SessionAttributes;

import cz.uhk.ppro.entities.Dil;
import cz.uhk.ppro.entities.Stitek;
import cz.uhk.ppro.form.FiltrDily;
import cz.uhk.ppro.form.Login;
import cz.uhk.ppro.form.SkladneniForm;
import cz.uhk.ppro.services.DilDbService;
import cz.uhk.ppro.services.LoginChecker;
import cz.uhk.ppro.services.StitekDbService;

@Controller
@SessionAttributes({"stitky", "cenaCelkem"})
public class ManagerMainController {
	Login login;
	DilDbService dilService;
	StitekDbService stitekService;
	BigDecimal cenaSkladu ;
	LoginChecker loginChecker;
	SkladneniForm skladneni;
		
	@Autowired
	public void setLoginChecker (LoginChecker loginChecker){
		this.loginChecker = loginChecker;
	}
	
	@ModelAttribute("login")
	public Login getLogin() {
		return new Login();
	}
	
	@ModelAttribute("filtrDily")
	public FiltrDily getFiltrDily() {
		return new FiltrDily();
	}
	
	@ModelAttribute("skladneni")
	public SkladneniForm getSkladneni() {
		return new SkladneniForm();
	}
	
	@Autowired
	public void setDilService (DilDbService dilService){
		this.dilService = dilService;
	}
	
	@Autowired
	public void setStitekService (StitekDbService stitekService){
		this.stitekService = stitekService;
	}
	
	@RequestMapping("/managerHome")
	public String show(Locale locale, ModelMap model, HttpSession session, @ModelAttribute("filtrDily") FiltrDily filtrDily) {
		if (loginChecker.checkLogin(session, "Manager")){
			
			filtrDily = new FiltrDily();
			List<Dil> dily = dilService.vypis();
			List<Stitek> stitkydb = stitekService.vypis();
			List<String> stitky = new ArrayList<String>();
			stitky.add("");
			for (Stitek s: stitkydb) {
				stitky.add(s.getNazevStitku());
			}
			cenaSkladu = new BigDecimal(0);
			for (Dil d: dily) {
				cenaSkladu = cenaSkladu.add(BigDecimal.valueOf(d.getPocetKusu() * d.getCenaKc()));
			}
			
			model.addAttribute("dily", dily);
			model.addAttribute("stitky", stitky);
			model.addAttribute("filtrDily", filtrDily);
			model.addAttribute("cenaCelkem", cenaSkladu);
			return "managerHome";
		} else {
			return "accessDenied";
		}
	}
	
	@SuppressWarnings({ "unchecked", "rawtypes" })
	@RequestMapping("/managerFiltrujDily")
    public String filtruj(ModelMap model, HttpSession session, @ModelAttribute("filtrDily") FiltrDily filtrDily) {
		//http://www.devx.com/java/Article/28754/1954 ten první dlouhej způsob, je pochopitelnější
		Map parameters = new HashMap();
		boolean firstClause = true; 
		StringBuffer queryBuf = new StringBuffer("from Dil d");
		String stitek = filtrDily.getStitek();
		String nazev = filtrDily.getNazev();
		String katCislo = filtrDily.getKatCislo();
		List<Dil> dily;
		
		 if (stitek.compareTo("") != 0) {
		        //queryBuf.append(firstClause ? " where " : " and "); //není třeba, bude to případně vždy první
		        
			 	queryBuf.append(" join d.stitky s where s.nazevStitku in :stitek");
		        parameters.put("stitek",stitek);
		        firstClause = false;
		    }    
		    if (nazev.compareTo("")!=0) {
		        queryBuf.append(firstClause ? " join d.stitky s where " : " and "); //join aby to vracelo ve stejném formátu
		        queryBuf.append("d.nazev like :nazev");
		        parameters.put("nazev","%"+nazev+"%");  // % je wildcard - *
		        firstClause = false;
		    }
		    if (katCislo.compareTo("")!=0) {
		        queryBuf.append(firstClause ? " join d.stitky s where " : " and ");
		        queryBuf.append("d.katalogoveCislo like :katCislo");
		        parameters.put("katCislo","%"+katCislo+"%");
		        firstClause = false;
		    }
		if (!firstClause){
			String query = queryBuf.toString();
			List<Object[]> dilydb = dilService.vypisKriteria(query, parameters);
			dily = new ArrayList<Dil>();
			for (Object[] o : dilydb){
				dily.add((Dil)o[0]);
			}
		} else {
			dily = dilService.vypis();
			}
		model.addAttribute("dily", dily);
		return "managerHome";
    }
	
	@RequestMapping("/precenit")
	public String precenit(Locale locale, ModelMap model, HttpSession session, 
			@ModelAttribute("skladneni") SkladneniForm skladneni, int id) {
		if (loginChecker.checkLogin(session, "Manager")){
			skladneni = new SkladneniForm();
			skladneni.setId(id);
			Dil d = dilService.vrat(id);
			skladneni.setCenaEur(d.getCenaEur());
			skladneni.setCenaKc(d.getCenaKc());
			skladneni.setCenaUsd(d.getCenaUsd());
			model.addAttribute("katC", d.getKatalogoveCislo());
			model.addAttribute("nazev", d.getNazev());
			model.addAttribute("pocet", d.getPocetKusu());
			model.addAttribute("skladneni", skladneni);
			return "managerPrecen";
		} else {
			return "accessDenied";
		}
	}
	
	@RequestMapping("/precenitAkce")
	public String precenitAkce(@ModelAttribute("skladneni") SkladneniForm skladneni,
			Locale locale, ModelMap model, HttpSession session) {
		if (loginChecker.checkLogin(session, "Manager")){
			Dil d = dilService.vrat(skladneni.getId());
			dilService.precenit(skladneni.getCenaKc(), skladneni.getCenaEur(), skladneni.getCenaUsd(), d);
			return "redirect:/managerHome";
		} else {
			return "accessDenied";
		}
	}
}
